package com.fysports.web.interceptor;

import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.log.Log;
import com.fysports.framework.exception.FrameException;
import com.fysports.web.config.AppConst;
import com.fysports.web.controller.AbstractBaseController;
import com.fysports.web.handler.SystemLogHandler;
import com.fysports.web.kit.commons.CookiesKit;
import com.fysports.web.kit.commons.DateTimeKit;
import com.fysports.web.kit.commons.PathBizKit;
import com.fysports.web.kit.commons.StringKit;
import com.fysports.web.model.system.SystemLog;

import java.util.Date;


/**
 * 系统权限判断（用户后台用户登录的权限验证）
 * Created by konbluesky
 * Date : 14-8-2 上午10:36
 * Project : JdmData_WebServer
 */

public class AuthenticationInterceptor implements Interceptor {

    private static Log log = Log.getLog(AuthenticationInterceptor.class);
    @Override public void intercept(Invocation ai) {
        AbstractBaseController col = (AbstractBaseController) ai.getController();
        /* 1. 获取SystemLog记录实体 */
        SystemLog reqSystemLog = (SystemLog) col.getRequest().getAttribute(SystemLogHandler.reqSystemLogKey);
        if (reqSystemLog == null)
            reqSystemLog = new SystemLog();
        col.setReqSysLog(reqSystemLog);


        /* 2. action 开始时间 记录 */
        long actionstarttime = DateTimeKit.getDateByTime();
        reqSystemLog.set("actionstartdate", DateTimeKit.getSqlTimestamp(actionstarttime));//开始时间
        reqSystemLog.set("actionstarttime", actionstarttime);//开始时间

        /*
        *   3.过滤移动API请求,直接invoke交给MobileAuthenticationinterceptor处理
        *   详情参考Appconfig中拦截器的注册顺序;
        * */
        /* 4. COOKIE 验证 */
        String authmark = col.getCookie(CookiesKit.COOKIES_AUTHMARK);
        if (StringKit.isBlank(authmark)) {
            col.render(PathBizKit.getPageAdminPath() + "/login.ftl");
        }
        else {
            CookiesKit.CookieVO cvo = CookiesKit.decodeCookieAuthToken(authmark);
            /*
            * 验证规则:
            * 1.验证cookie完整性
            * 2.验证登录日期是否过期
            * *待添加3.验证登录用户是否有效
            *
            * 2015.7.2 add
            * cookie中date 为过期时间,默认过期时间为登录时间+1天
            * 比对和当前登录时间
            *
            * */
            Date verdate = new Date(Long.parseLong(cvo.getDate()));
            long ddr = DateTimeKit.compareTwoDate(verdate, new Date());
            if (cvo != null && cvo.getAppname().equals(AppConst.APPNAME) && ddr > 0) {
                ai.invoke();
            }
            else {
                log.error("登录信息过期，请重新登录!",new FrameException("登录信息过期，请重新登录!"));
                col.render(PathBizKit.getPageAdminPath() + "/login.ftl");
            }
        }
        /* 4. action 结束时间 记录 */
        long actionendtime = DateTimeKit.getDateByTime();
        reqSystemLog.set("actionenddate", DateTimeKit.getSqlTimestamp(actionendtime));
        reqSystemLog.set("actionendtime", actionendtime);
    }
}
